﻿using System;
using System.Configuration;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject;
using PGE.AfastamentosTempMVC.Modelo;
using PGE.AfastamentosTempMVC.Repositorio.Interfaces;
using PGE.AfastamentosTempMVC.Repositorio.Implementacao;
using PGE.AfastamentosTempMVC.Servico.Interfaces;
using PGE.AfastamentosTempMVC.Servico.Implementacao;
using PGE.AfastamentosTempMVC.WebApp.Infraestrutura.Interfaces;
using PGE.AfastamentosTempMVC.WebApp.Infraestrutura.Implementacao;

namespace PGE.AfastamentosTempMVC.WebApp.Infraestrutura
{
    public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;

        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            AddBindings();
        }

        protected override IController GetControllerInstance(RequestContext requestContext,
            Type controllerType)
        {
            return controllerType == null
                ? null
                : (IController)ninjectKernel.Get(controllerType);
        }

        private void AddBindings()
        {            
            ninjectKernel.Bind<IUnitOfWork>().
                  To<UnitOfWork>();

            // Resolve as dependências da camada Repository
            ninjectKernel.Bind<IAfastamentoRepositorio>().
                To<AfastamentoRepositorio>();

            ninjectKernel.Bind<IFuncionarioRepositorio>().
                To<FuncionarioRepositorio>();

            ninjectKernel.Bind<INucleoRepositorio>().
                To<NucleoRepositorio>();

            ninjectKernel.Bind<ISetorRepositorio>().
                To<SetorRepositorio>();

            ninjectKernel.Bind<ITipoAfastamentoRepositorio>().
                To<TipoAfastamentoRepositorio>();

            // Resolve as dependências da camada Service
            ninjectKernel.Bind<IAfastamentoServico>().
                To<AfastamentoServico>();

            ninjectKernel.Bind<IFuncionarioServico>().
                To<FuncionarioServico>();

            ninjectKernel.Bind<INucleoServico>().
                To<NucleoServico>();

            ninjectKernel.Bind<ISetorServico>().
                To<SetorServico>();

            ninjectKernel.Bind<ITipoAfastamentoServico>().
                To<TipoAfastamentoServico>();
        }
    }
}